/*
 * ComponenteDistribuidorGeneradorUnitario.java	 
 *
 * Copyright 2008 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 07/10/08, 11:23:38 AM
 */
package com.ufps.cuatro.modelo.representacion.componente;

import com.ufps.cuatro.controlador.render.UtilRender;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.ufps.cuatro.modelo.biblioteca.TipoBiblioteca;
import com.ufps.cuatro.modelo.old.ComponenteBeans;
import com.ufps.cuatro.modelo.representacion.InternalProperty;
import com.ufps.cuatro.modelo.representacion.ModeloAsociado;
import com.ufps.cuatro.modelo.representacion.ObjetoTipoDatoReflexion;
import com.ufps.cuatro.modelo.representacion.PlantillaCombo;
import com.ufps.cuatro.modelo.representacion.PlantillaComponente;
import com.ufps.cuatro.modelo.representacion.PropiedadBeans;
import com.ufps.cuatro.modelo.representacion.TipoColeccionModeloAsociado;
import com.ufps.cuatro.util.TipoCaso;
import com.ufps.cuatro.util.Utileria;
import com.ufps.cuatro.util.base.ComponenteBaseStandar;
import com.ufps.cuatro.util.generadores.GeneradorComponentes;
import com.ufps.cuatro.util.generadores.codeobject.CodeConstants;
import com.ufps.cuatro.util.generadores.codeobject.CodeContextLine;
import com.ufps.cuatro.util.generadores.codeobject.CodeProcessAsociateModel;
import com.ufps.cuatro.util.generadores.codeobject.CodeProcessGeneratorSingle;
import com.ufps.cuatro.util.generadores.codeobject.EnumTypeCodeSyntax;


/**
 * <i><b>ComponenteDistribuidorGeneradorUnitario:</b></i><p>Esta Clase permite representar 
 * Controles Swing que soporten Tipos de Datos Simples.</p>
 * <p>Un Tipo de Dato Simple se define como aquellos tipos que no contienen 
 * estructuras internas que necesiten ser representadas en la Intefaz Gráfica. 
 * A este Grupo de Tipos de Datos pertenecen los Tipos Primitivos como 
 * (int, char, boolean, double, float, long, byte) y algunas Clases del JDK 
 * como (String, File, StringBuffer, StrinTokenizer y todas aquellas registradas
 * en la Aplicación que pertenezcan al JDK y cumplan con la Regla de Represenrtación.</p>
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 07/10/08
 * @see     ComponenteDistribuidorGenerador
 * @see     CodeProcessGeneratorSingle
 */
public class ComponenteDistribuidorGeneradorUnitario extends ComponenteDistribuidorGenerador implements CodeProcessGeneratorSingle, CodeProcessAsociateModel{
    private static final long serialVersionUID = 3177635493121188050L;
           
    private int idClaseComponenteGeneradorUnitario;
    /**
     * Serie Númerica para la generación de id de Objetos.
     */
    public static int serialIdComponenteGeneradorUnitario;    
       
    /**
     * Contiene el <code>ComponenteGeneradoInterno</code> Principal que representará el
     * Control Swing que asu vez representa el Tipo de Dato del Modelo Analizado.
     */
    protected ComponenteGeneradoInterno objComponenteGenerador;
    /**
     * Esta Cadena contiene los ids de <code>ComponenteGeneradoSimple</code> incluidos en la creación
     * del Componente.
     */
    protected String strComponentesGenerados;              
    /**
     * Colección de Referencias a los <code>ComponenteDistribuidor</code> que representan el Modelo Asociado para este
     * Componente.
     */
    protected ArrayList<ComponenteDistribuidor> objComponentesDistribuidoresModeloAsociado;
    /**
     * Modelo Asociado que representará el <code>ComponenteDistribuidor</code>
     * en la Representación del Caso Colección.
     */
    protected ModeloAsociado objModeloAsociado;
    /**
     * Referencia al Componente que representan el Modelo Asociado para un array.
     */
    protected ComponenteDistribuidorGenerador objComponenteGeneradorIntoCasoArray;
    /**
     * Indica si el Componente Actual tiene un Componente Incluido. Esto solo
     * aplica para el Caso Array.
     * 
     */
    protected boolean intoCasoArray;
    /**
     * Indica si el Componente Actual tiene un Modelo Asociado. Esto solo
     * aplica para el Caso Colección.
     * 
     */
    protected boolean intoCasoColeccion;
    
    /**
     * Componente Utilizado en la Implementación.
     * @param objComponenteBase Referencia al <code>ComponenteBaseStandar</code> que representa un Control Swing.
     * @param strClassPathTipoDato classPath del Tipo de Dato.     
     * @param heredado Indica si el Componente hace parte de una Cadena de Herencia en una Instanciación de un Objeto.
     * @param previsualizar  Indica si el Componente puede generar vistas previas.
     */
    public ComponenteDistribuidorGeneradorUnitario(ComponenteBaseStandar objComponenteBase, String strClassPathTipoDato, boolean heredado, boolean previsualizar) {
        super(objComponenteBase, strClassPathTipoDato, true, true); 
        this.heredado = heredado;
        this.previsualizar = previsualizar;
        this.objCasosCompatibles = new ArrayList<TipoCaso>();        
        this.objComponentesDistribuidoresModeloAsociado = new ArrayList<ComponenteDistribuidor>();
        this.dni = Utileria.leerRecursoTexto("Utileria.dni.componente.distribuidor.generador.unitario");   
        if(!heredado){
            this.idClaseComponenteGeneradorUnitario = (!previsualizar) ?
                    ComponenteDistribuidorGeneradorUnitario.serialIdComponenteGeneradorUnitario++ :
                    ComponenteDistribuidorGeneradorUnitario.serialIdComponenteGeneradorUnitario;
        }
        if(strClassPathTipoDato.length() >= 2){
            int i = strClassPathTipoDato.lastIndexOf(".");
            this.strSimpleClassPathTipoDato = 
                    String.valueOf(Character.toUpperCase(strClassPathTipoDato.charAt(i + 1))) + 
                    strClassPathTipoDato.substring(i + 2);        
        }
    }

    /**
     * Devuelve el id de creación del Componente. 
     * @return id de creación del Componente. 
     */
    public int getIdClaseComponenteGeneradorUnitario() {
      try{
            return idClaseComponenteGeneradorUnitario;
        }catch(java.lang.NullPointerException ex){}
      return 0;
    }         
    
    public void crearDistribuicionGrupalInicial(PlantillaCombo objPlantillaCombo, ArrayList<PlantillaComponente> objTempPlantillasComponentes){                
      try{
        ArrayList<Componente> objComponentesIncluidos = new ArrayList<Componente>();
        //Ubicar cada Plantilla con el Componente Asigando y Actualizar
        //Esta busqueda se hace por medio del id
        for(PlantillaComponente objTempPlantillaComponente : objTempPlantillasComponentes){
            if(!objTempPlantillaComponente.isGenerador()){
                ComponenteGeneradoSimple objComponenteGenerado = this.objComponentesGenerados.get(objTempPlantillaComponente.getId());                
                objComponenteGenerado.agregarDistribucionIndividual(objPlantillaCombo, objTempPlantillaComponente);
                objComponentesIncluidos.add(objComponenteGenerado);
            }
            else{                
                this.objComponenteGenerador.agregarDistribucionIndividual(objPlantillaCombo, objTempPlantillaComponente);
                objComponentesIncluidos.add(this.objComponenteGenerador);
            }            
        }
        Distribuidor objDistribuidor = new Distribuidor(objComponentesIncluidos, objPlantillaCombo);
        this.agregarDistribucionGrupal(objPlantillaCombo, objDistribuidor);
        }catch(java.lang.NullPointerException ex){}
      
    }
      
    public ArrayList<PlantillaComponente> getDistribucionGrupalInicialHorizontal(PlantillaCombo objPlantillaCombo){
        try{
            int size = this.objComponentesGenerados.size();
            int filas = 0;
            int proxX = 0;            
            ArrayList<PlantillaComponente> objTempPlantillas = new ArrayList<PlantillaComponente>();
            for(int i = 0; i < size; i++){                
                Object obj = this.objComponentesGenerados.get(i);
                PlantillaComponente objPlantilla = new PlantillaComponente();
                if(obj instanceof ComponenteGeneradoSimple){
                    ComponenteGeneradoSimple objComponenteGenerado = (ComponenteGeneradoSimple) obj;                    
                    objPlantilla.setX(proxX);
                    objPlantilla.setY(filas);                    
                    objPlantilla.updateGridBadConstraintsFromComponente(objComponenteGenerado, objPlantillaCombo, true);
                    objPlantilla.setGenerador(false);
                    objPlantilla.setHeight(objComponenteGenerado.getObjGridBagConstraints().gridheight);
                    objPlantilla.setWidth(objComponenteGenerado.getObjGridBagConstraints().gridwidth);                    
                    objPlantilla.setIdComponente(objComponenteGenerado.getId());
                    objPlantilla.setId(i);
                    objPlantilla.setIdPlantilla(0);
                    objPlantilla.setIncluido(true);
                    objPlantilla.setZona(0);
                    this.objComponentesGenerados.set(i, objComponenteGenerado);
                }                
                proxX = objPlantilla.getObjGridBagConstraints().gridwidth;
                objTempPlantillas.add(objPlantilla);
            }
            //Se crea la Plantilla Componente para el Componente Parent
            PlantillaComponente objPlantilla = new PlantillaComponente();                            
            objPlantilla.setX(proxX);
            objPlantilla.setY(filas);            
            objPlantilla.updateGridBadConstraintsFromComponente(objComponenteGenerador, objPlantillaCombo, true);
            objPlantilla.setGenerador(true);
            objPlantilla.setHeight(this.objComponenteGenerador.getObjGridBagConstraints().gridheight);
            objPlantilla.setWidth(this.objComponenteGenerador.getObjGridBagConstraints().gridwidth);                    
            objPlantilla.setIdComponente(this.objComponenteGenerador.getId());
            objPlantilla.setId(objTempPlantillas.size());
            objPlantilla.setIdPlantilla(0);
            objPlantilla.setIncluido(true);
            objPlantilla.setZona(0);
            objTempPlantillas.add(objPlantilla);
            return objTempPlantillas;
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);            
        }
        return null;
    }
        
    public ArrayList<PlantillaComponente> getDistribucionGrupalInicialVertical(PlantillaCombo objPlantillaCombo){
        try{
            int size = this.objComponentesGenerados.size();
            int columnas = 0;
            int proxX = 0;            
            ArrayList<PlantillaComponente> objTempPlantillas = new ArrayList<PlantillaComponente>();
            for(int i = 0; i < size; i++){                
                Object obj = this.objComponentesGenerados.get(i);
                PlantillaComponente objPlantilla = new PlantillaComponente();
                if(obj instanceof ComponenteGeneradoSimple){
                    ComponenteGeneradoSimple objComponenteGenerado = (ComponenteGeneradoSimple) obj;                    
                    objPlantilla.setX(columnas);
                    objPlantilla.setY(proxX);                    
                    objPlantilla.updateGridBadConstraintsFromComponente(objComponenteGenerado, objPlantillaCombo, true);
                    objPlantilla.setGenerador(false);
                    objPlantilla.setHeight(objComponenteGenerado.getObjGridBagConstraints().gridheight);
                    objPlantilla.setWidth(objComponenteGenerado.getObjGridBagConstraints().gridwidth);                    
                    objPlantilla.setIdComponente(objComponenteGenerado.getId());
                    objPlantilla.setId(i);
                    objPlantilla.setIdPlantilla(0);
                    objPlantilla.setIncluido(true);
                    objPlantilla.setZona(0);
                    this.objComponentesGenerados.set(i, objComponenteGenerado);                    
                }           
                proxX = objPlantilla.getObjGridBagConstraints().gridheight;
                objTempPlantillas.add(objPlantilla);
            }
            //Se crea la Plantilla Componente para el Componente Parent
            PlantillaComponente objPlantilla = new PlantillaComponente();                            
            objPlantilla.setX(columnas);
            objPlantilla.setY(proxX);            
            objPlantilla.updateGridBadConstraintsFromComponente(objComponenteGenerador, objPlantillaCombo, true);
            objPlantilla.setGenerador(true);
            objPlantilla.setHeight(this.objComponenteGenerador.getObjGridBagConstraints().gridheight);
            objPlantilla.setWidth(this.objComponenteGenerador.getObjGridBagConstraints().gridwidth);                    
            objPlantilla.setIdComponente(this.objComponenteGenerador.getId());
            objPlantilla.setId(objTempPlantillas.size());
            objPlantilla.setIdPlantilla(0);
            objPlantilla.setIncluido(true);
            objPlantilla.setZona(0);
            objTempPlantillas.add(objPlantilla);
            return objTempPlantillas;
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
        
    public ArrayList<PlantillaComponente> getDistribucionGrupalInicialRectangular(PlantillaCombo objPlantillaCombo){
        try{
            return null;
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
    
    /**
     * Deveuvle la Cadena que contiene los ids de <code>ComponenteGeneradoSimple</code> incluidos en la creación
     * del Componente.
     * @return Cadena que contiene los ids de <code>ComponenteGeneradoSimple</code> incluidos en la creación
     * del Componente.
     */
    public String getStrComponentesGenerados() {
        return strComponentesGenerados;
    }

    /**
     * Establece la Cadena que contiene los ids de <code>ComponenteGeneradoSimple</code> incluidos en la creación
     * del Componente.
     * @param strComponentesGenerados Cadena que contiene los ids de <code>ComponenteGeneradoSimple</code> incluidos en la creación
     * del Componente.
     */
    public void setStrComponentesGenerados(String strComponentesGenerados) {        
        this.strComponentesGenerados = strComponentesGenerados;
    }

    /**
     * Devuelve la Referencia que Contiene el <code>ComponenteGeneradoInterno</code> Principal que representará el
     * Control Swing que asu vez representa el Tipo de Dato del Modelo Analizado.
     * @return <code>ComponenteGeneradoInterno</code> Principal que representará el
     * Control Swing que asu vez representa el Tipo de Dato del Modelo Analizado.
     */
    public ComponenteGeneradoInterno getObjComponenteGenerador() {
        return objComponenteGenerador;
    }

    /**
     * Establece la Referencia que Contiene el <code>ComponenteGeneradoInterno</code> Principal que representará el
     * Control Swing que asu vez representa el Tipo de Dato del Modelo Analizado.
     * @param objComponenteGenerador Contiene el <code>ComponenteGeneradoInterno</code> Principal que representará el
     * Control Swing que asu vez representa el Tipo de Dato del Modelo Analizado.
     */
    public void setObjComponenteGenerador(ComponenteGeneradoInterno objComponenteGenerador) {
        this.objComponenteGenerador = objComponenteGenerador;
    }    
    
    public int sizeWidth(){        
      try{
        int size = 0;        
        for(ComponenteGeneradoSimple objComponente : this.objComponentesGenerados){
            size += objComponente.getObjPlantillaComponenteDistribucionIndividualSeleccionada().getObjGridBagConstraints().gridwidth;
        }
        return size + this.objComponenteGenerador.getObjPlantillaComponenteDistribucionIndividualSeleccionada().getObjGridBagConstraints().gridwidth;        
        }catch(java.lang.NullPointerException ex){}
      return 0;
    }

    public int sizeHeight(){        
      try{
        int size = 0;
        for(ComponenteGeneradoSimple objComponente : this.objComponentesGenerados){
            size += objComponente.getObjPlantillaComponenteDistribucionIndividualSeleccionada().getObjGridBagConstraints().gridheight;
        }
        return size + this.objComponenteGenerador.getObjPlantillaComponenteDistribucionIndividualSeleccionada().getObjGridBagConstraints().gridheight;        
        }catch(java.lang.NullPointerException ex){}
      return 0;
    }
    
    public boolean ubicarComponentesEnTablaDistribucion(){        
        try{
            Distribuidor objDistribuidorSeleccionado = this.getObjDistribuidorGrupalSeleccionado();
            return objDistribuidorSeleccionado.generarTablaDistribucion();
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }
   
    public Componente buscarComponente(String strName){
        try{       
            strName = Utileria.formatStringSinHTML(strName);
            Componente objComponente;
            //Primero se Busca en la Colección de Componentes Incluidos
            objComponente = this.buscarComponenteEnDistribucion(strName);
            if(objComponente != null){
                return objComponente;
            }
            //Luego busco en los Componentes Generados
            objComponente = this.getObjComponenteIncluido(strName);
            if(objComponente != null){
                return objComponente;
            }
            if(this.objComponenteGenerador.getName().equals(strName)){
                return this.objComponenteGenerador;
            }
        }catch(java.lang.NullPointerException ex){            
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }    

    @Override    
    public String toString() {
       try{
        if(this.eBiblioteca == TipoBiblioteca.eSwap) {
            return this.objClassSwing.getSimpleName() + "BS" + this.dni + this.idClaseComponenteGeneradorUnitario;
        }
        else if(this.eBiblioteca == TipoBiblioteca.eLocal) {
            return this.objClassSwing.getSimpleName() + "BL" + this.dni + this.idClaseComponenteGeneradorUnitario;
        }
        else if(this.eBiblioteca == TipoBiblioteca.eGlobal) {
            return this.objClassSwing.getSimpleName() + "BG" + this.dni + this.idClaseComponenteGeneradorUnitario;
        }
        else if(this.getObjPropiedadesDisponibles() != null){            
            //se evalua si la propiedad name ha sido inicializada
            if(!this.getObjPropiedadesDisponibles().isEmpty()){                
                return this.getName();
            }
        }
        return this.objClassSwing.getSimpleName() + this.dni + this.idClaseComponenteGeneradorUnitario;
    }catch(java.lang.NullPointerException ex){}
       return "";
    }
    
    @Override
    public int compareTo(Object o) {
      try{
        if(o instanceof ComponenteDistribuidorGeneradorClase ||                
                o instanceof ComponenteDistribuidorIntegrador ||
                o instanceof ComponenteDistribuidorGeneradorVinculador ||
                o instanceof ComponenteDistribuidorGeneradorString){
            return 1;
        }
        else if(o instanceof ComponenteDistribuidorGeneradorEnum){
            return -1;
        }
        else{
            ComponenteDistribuidorGeneradorUnitario obj = (ComponenteDistribuidorGeneradorUnitario) o;
            if(this.idClaseComponenteGeneradorUnitario > obj.idClaseComponenteGeneradorUnitario)
                return 1;
            else if(this.idClaseComponenteGeneradorUnitario < obj.idClaseComponenteGeneradorUnitario)
                return -1;
            else
                return 0;
        }
    } catch(java.lang.NullPointerException ex) {}
      return 0;
    }  
    
    public boolean actualizarPlantillaComboDistribucionGrupalSeleccionada(PlantillaCombo objPlantillaComboDistribucionGrupalSeleccionada) {
      try{
        try{
            this.objPlantillaComboDistribucionGrupalSeleccionada = objPlantillaComboDistribucionGrupalSeleccionada;
            this.objComponenteGenerador.objPlantillaComboDistribucionIndividualSeleccionada = objPlantillaComboDistribucionGrupalSeleccionada;
            for(ComponenteGeneradoSimple objComponenteGenerado : this.objComponentesGenerados){
                objComponenteGenerado.setObjPlantillaComboDistribucionIndividualSeleccionada(objPlantillaComboDistribucionGrupalSeleccionada);
            }            
            return true;
        }catch(java.lang.ArrayIndexOutOfBoundsException ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);            
        }catch(java.lang.ArrayStoreException ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);            
        }
      }catch(java.lang.NullPointerException ex){}
      return false;
    }      

    @Override
    public void ok() {
        if(this.previsualizar){
            this.idClaseComponenteGeneradorUnitario = ComponenteDistribuidorGeneradorUnitario.serialIdComponenteGeneradorUnitario++;
            this.previsualizar = false;
        }
    }
        
    @Override
    public boolean equals(Object obj) {
        if(obj instanceof ComponenteDistribuidorGeneradorUnitario){
            ComponenteDistribuidorGeneradorUnitario objComponente = (ComponenteDistribuidorGeneradorUnitario) obj;
            return this.toString().equals(objComponente.toString());
        }
        return super.equals(obj);
    }

    @Override
    public int hashCode() {
      try{
        int hash = 7;
        hash = 37 * hash + this.idClaseComponenteGeneradorUnitario;
        return hash;
        }catch(java.lang.NullPointerException ex) {}
        return 0;
    }   
    
    public void importId(int id){
        ComponenteDistribuidorGeneradorUnitario.serialIdComponenteGeneradorUnitario = ++id;
        this.idClaseComponenteGeneradorUnitario = ComponenteDistribuidorGeneradorUnitario.serialIdComponenteGeneradorUnitario++;
    }   

    /**
     * Devuelve la Colección de Referencias de Componentes que representa el Modelo Asociado para este
     * Componente.
     * @return Colección de Referencias de Componentes que representa el Modelo Asociado para este
     * Componente.
     */
    public ArrayList<ComponenteDistribuidor> getObjComponentesDistribuidoresModeloAsociado() {
        return objComponentesDistribuidoresModeloAsociado;
    }

    /**
     * Establece la Colección de Referencias de Componentes que representa el Modelo Asociado para este
     * Componente.
     * @param objComponentesDistribuidoresModeloAsociado Colección de Referencias de Componentes que representa el Modelo Asociado para este
     * Componente.
     */
    public void setObjComponentesDistribuidoresModeloAsociado(ArrayList<ComponenteDistribuidor> objComponentesDistribuidoresModeloAsociado) {
        this.requiereModeloAsociado = true;
        this.intoCasoColeccion = true;
        this.objComponentesDistribuidoresModeloAsociado = objComponentesDistribuidoresModeloAsociado;
    }

    
    /**
     * Devuelve el Estado que Indica si el Componente Actual tiene un Componente Incluido. Esto solo
     * aplica para el Caso Array.
     * @return Estado que Indica si el Componente Actual tiene un Componente Incluido. Esto solo
     * aplica para el Caso Array.
     */
    public boolean isIntoCasoArray() {
        return intoCasoArray;
    }    

    /**
     * Devuelve el Componente que representan el Modelo Asociado para un array.
     * @return Componente que representan el Modelo Asociado para un array.
     */
    public ComponenteDistribuidorGenerador getObjComponenteGeneradorIntoCasoArray() {        
        return objComponenteGeneradorIntoCasoArray;
    }

    /**
     * Establece el Componente que representan el Modelo Asociado para un array.
     * @param objComponenteGeneradorIntoCasoArray Componente que representan el Modelo Asociado para un array.
     */
    public void setObjComponenteGeneradorIntoCasoArray(ComponenteDistribuidorGenerador objComponenteGeneradorIntoCasoArray) {                
        this.intoCasoArray = true;
        this.objComponenteGeneradorIntoCasoArray = objComponenteGeneradorIntoCasoArray;
    }

    /**
     * Devuelve el Estado que Indica si el Componente Actual tiene un Modelo Asociado. Esto solo
     * aplica para el Caso Colección.
     * @return Estado que Indica si el Componente Actual tiene un Modelo Asociado. Esto solo
     * aplica para el Caso Colección.
     */
    public boolean isIntoCasoColeccion() {
        return intoCasoColeccion;
    }
    
    @Override
    public Componente getObjComponenteIncluido(String strName) { 
        try{            
            for(ComponenteGeneradoSimple objComponenteGenerado : this.getObjComponentesGenerados()){
                String strPropertiesName = (String) objComponenteGenerado.getName();
                if(strName.equals(strPropertiesName)){
                    return objComponenteGenerado;                    
                }                
            }             
            String strPropertiesName = (String) this.objComponenteGenerador.getName();
            if(strName.equals(strPropertiesName)){
                return this;
            }            
        }catch(java.lang.NullPointerException ex){}
        return null;
    }   
    
    //    @Override
//    protected Object clone(){
//        ComponenteGeneradorSimple objClon = null;                 
//        //Primero se Clona la Referencia Local
//        objClon = (ComponenteGeneradorSimple) super.clone();                                
//        //Ahora se hace la Clonación Profunda
//        if(objCasosCompatibles != null){
//            ((ComponenteGeneradorSimple)objClon).setObjCasosCompatibles(objCasosCompatibles);
//        }
//        if(objComponenteGeneradorIntoCasoArray != null){
//            ((ComponenteGeneradorSimple)objClon).setObjComponenteGeneradorIntoCasoArray((ComponenteDistribuidorGenerador)objComponenteGeneradorIntoCasoArray.clone());
//        }
//        if(objComponentesDistribuidoresModeloAsociado != null){
//            ((ComponenteGeneradorSimple)objClon).setObjComponentesDistribuidoresModeloAsociado((ArrayList<ComponenteGenerador>)objComponentesDistribuidoresModeloAsociado.clone());
//        }
//        if(objComponentesGenerados != null){
//            ((ComponenteGeneradorSimple)objClon).setObjComponentesGenerados((ArrayList<ComponenteGenerado>)objComponentesGenerados.clone());
//        }
//        if(objPlantillaComponenteSeleccionada != null){
//            ((ComponenteGeneradorSimple)objClon).setObjPlantillaComponenteSeleccionada((PlantillaComponente)objPlantillaComponenteSeleccionada.clone());
//        }
//        if(objPlantillaSeleccionada != null){
//            ((ComponenteGeneradorSimple)objClon).setObjPlantillaSeleccionada((Plantilla<Componente>)objPlantillaSeleccionada.clone());
//        }
//        if(objPlantillas != null){
//            ((ComponenteGeneradorSimple)objClon).cargarPlantillasDesdeArchivoProperties((ArrayList<Plantilla<Componente>>)objPlantillas.clone());
//        }
//        if(objPlantillasComboDistribucionesGrupales != null){
//            ((ComponenteGeneradorSimple)objClon).setObjPlantillasCombos((ArrayList<PlantillaCombo>)objPlantillasComboDistribucionesGrupales.clone());
//        }        
//        return objClon;
//    }   

    /**
     * Devuelve el Modelo Asociado que representará el <code>ComponenteDistribuidor</code>
     * en la Representación del Caso Colección.
     * @return Modelo Asociado que representará el <code>ComponenteDistribuidor</code>
     * en la Representación del Caso Colección.
     */
    public ModeloAsociado getObjModeloAsociado() {
        return objModeloAsociado;
    }

    /**
     * Establece el Modelo Asociado que representará el <code>ComponenteDistribuidor</code>
     * en la Representación del Caso Colección.
     * @param objModeloAsociado Modelo Asociado que representará el <code>ComponenteDistribuidor</code>
     * en la Representación del Caso Colección.
     */
    public void setObjModeloAsociado(ModeloAsociado objModeloAsociado) {
        this.intoCasoColeccion = true;
        this.requiereModeloAsociado = true;
        this.objModeloAsociado = objModeloAsociado;
    }

    public ComponenteDistribuidor convertirEnComponenteLibre() {
        return null;
    }
    
    
    public ComponenteBeans generarRepresentacionBeans() {
        ComponenteBeans objTempComponenteBeans = new ComponenteBeans(this);
        PropiedadBeans objPropiedadBeans = objComponenteGenerador.getObjPropiedadBeans();
        objTempComponenteBeans.add(objPropiedadBeans);        
        return objTempComponenteBeans;
    }

    @Override
    public void setObjTipoDato(ObjetoTipoDatoReflexion objTipoDato) {
        super.setObjTipoDato(objTipoDato); //To change body of generated methods, choose Tools | Templates.
        //Se agrega una nueva funcionalidad para soportar los modleos estiticos en
        //los tipos de datos analizados, la actualización se implementa con el fin
        //de poder utilizar este tipo de representaciones para listas o selecciones.
        if(objComponenteGenerador != null){            
            objComponenteGenerador.setCanonicalNameTipoDato(objTipoDato.getObjClass().getCanonicalName());
            objComponenteGenerador.setSimpleNameTipoDato(objTipoDato.getObjClass().getSimpleName());
        }
    }

    @Override
    public ArrayList<CodeContextLine> generateSourceCodeSyntax(EnumTypeCodeSyntax eTypeCodeSintax) {
        ArrayList<CodeContextLine> objSourceLinesCode = new ArrayList<CodeContextLine>();        
        if(eTypeCodeSintax == EnumTypeCodeSyntax.eImport){
            generateSourceCodeSyntaxFaseImport(objSourceLinesCode);
        }
        else if(eTypeCodeSintax == EnumTypeCodeSyntax.eImportAsociateModel){
            generateSourceCodeSyntaxCollectionAsociateModelDefinition(objSourceLinesCode, true);
        }
        else if(eTypeCodeSintax == EnumTypeCodeSyntax.eFieldsDefinitionSimple){
            generateSourceCodeSyntaxDefinition(objSourceLinesCode, false);
        }        
        else if(eTypeCodeSintax == EnumTypeCodeSyntax.eFieldsDefinitionCanonical){
            generateSourceCodeSyntaxDefinition(objSourceLinesCode, true);
        }
        else if(eTypeCodeSintax == EnumTypeCodeSyntax.eFieldsInitializationSimple){
            generateSourceCodeSyntaxInitialization(objSourceLinesCode, false);
        }        
        else if(eTypeCodeSintax == EnumTypeCodeSyntax.eFieldsInitializationCanonical){
            generateSourceCodeSyntaxInitialization(objSourceLinesCode, true);
        }
        else if(eTypeCodeSintax == EnumTypeCodeSyntax.eFieldsInitializationPropertiesSimple){
            generateSourceCodeSyntaxInitializationPropertiesControls(objSourceLinesCode, false);
        }
        else if(eTypeCodeSintax == EnumTypeCodeSyntax.eFieldsInitializationPropertiesCanonical){
            generateSourceCodeSyntaxInitializationPropertiesControls(objSourceLinesCode, true);
        }
        else if(eTypeCodeSintax == EnumTypeCodeSyntax.eFieldsInitializationGridBagConstraintsSimple){
            generateSourceCodeSyntaxInitializationGridBagConstraintsControls(objSourceLinesCode, false);
        }
        else if(eTypeCodeSintax == EnumTypeCodeSyntax.eFieldsInitializationGridBagConstraintsCanonical){
            generateSourceCodeSyntaxInitializationGridBagConstraintsControls(objSourceLinesCode, true);
        }        
        else if(eTypeCodeSintax == EnumTypeCodeSyntax.eFieldsDefinitionEventsSimple){
            generateSourceCodeSyntaxControlsEventsDefinition(objSourceLinesCode, false);
        }
        else if(eTypeCodeSintax == EnumTypeCodeSyntax.eFieldsDefinitionEventsCanonical){
            generateSourceCodeSyntaxControlsEventsDefinition(objSourceLinesCode, true);
        }
        else if(eTypeCodeSintax == EnumTypeCodeSyntax.eFieldsDefinitionEventsFunctionSimple){
            //Pendiente
        }
        else if(eTypeCodeSintax == EnumTypeCodeSyntax.eFieldsDefinitionEventsFunctionCanonical){
            //Pendiente
        }
        else if(eTypeCodeSintax == EnumTypeCodeSyntax.eFieldsDefinitionEventsAsociateModelAbstractListSimple){
            if(objModeloAsociado != null){
                //generateSourceCodeSyntaxCollectionAsociateModelDefinition(objSourceLinesCode, false);
                generateSourceCodeSyntaxEventsButtonsAbstractListAsociateModelCode(objSourceLinesCode, false);
            }
        }
        else if(eTypeCodeSintax == EnumTypeCodeSyntax.eFieldsDefinitionEventsFunctionsAsociateModelAbstractListSimple){
            if(objModeloAsociado != null){
                //generateSourceCodeSyntaxFunctionEncapsuleAsociateModelDefinition(objSourceLinesCode, false);
                generateSourceCodeSyntaxEventsButtonsAbstractListAsociateModelDefinition(objSourceLinesCode, false);
            }
        }
        else if(eTypeCodeSintax == EnumTypeCodeSyntax.eFieldsDefinitionEventsAsociateModelAbstractListCanonical){
            if(objModeloAsociado != null){
                //generateSourceCodeSyntaxCollectionAsociateModelDefinition(objSourceLinesCode, true);
                generateSourceCodeSyntaxEventsButtonsAbstractListAsociateModelCode(objSourceLinesCode, true);
            }
        }        
        else if(eTypeCodeSintax == EnumTypeCodeSyntax.eFieldsDefinitionEventsFunctionsAsociateModelAbstractListCanonical){
            if(objModeloAsociado != null){
                //generateSourceCodeSyntaxFunctionEncapsuleAsociateModelDefinition(objSourceLinesCode, true);
                generateSourceCodeSyntaxEventsButtonsAbstractListAsociateModelDefinition(objSourceLinesCode, true);
            }
        }
        else if(eTypeCodeSintax == EnumTypeCodeSyntax.eMethodDefinitionAsociateModelSimple){
            generateSourceCodeSyntaxFunctionEncapsuleAsociateModelDefinition(objSourceLinesCode, false);
        }        
        else if(eTypeCodeSintax == EnumTypeCodeSyntax.eMethodDefinitionAsociateModelCanonical){
            generateSourceCodeSyntaxFunctionEncapsuleAsociateModelDefinition(objSourceLinesCode, true);
        }        
        return objSourceLinesCode;
    }

    @Override
    public CodeContextLine generateSingleSourceCodeSyntax(EnumTypeCodeSyntax eTypeCodeSintax) {
        if(eTypeCodeSintax == EnumTypeCodeSyntax.eImportAsociateModel){
            return this.generateSourceCodeSyntaxImportAsociateModel();
        }
        return null;
    }   
    
    public void generateSourceCodeSyntaxDefinition(ArrayList<CodeContextLine> objSourceLinesCode, boolean canonicalDefinition){
        try{
            if(objModeloAsociado != null){
                generateSourceCodeSyntaxCollectionAsociateModelDefinition(objSourceLinesCode, canonicalDefinition);                                             
            }
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteGenerado){                    
                    ComponenteGenerado objComponenteGenerado = (ComponenteGenerado) objComponenteDistribuido;
                    if(objComponenteGenerado.isIncluido()){
                        addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSyntaxDefinition(canonicalDefinition));
                        if(objComponenteGenerado.isComponentCollection()){
                            addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSyntaxDefinitionAsociateScroll(canonicalDefinition));
                        }
                        if(objComponenteGenerado.isContainsStaticListModelString()){
                            addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSintaxDefinitionStaticListModel());
                        }                        
                    }                    
                }
            }
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }        
    }
    
    public void generateSourceCodeSyntaxInitialization(ArrayList<CodeContextLine> objSourceLinesCode, boolean canonicalDefinition){
        try{
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteGenerado){                    
                    ComponenteGenerado objComponenteGenerado = (ComponenteGenerado) objComponenteDistribuido;
                    if(objComponenteGenerado.isIncluido()){
                        if(objComponenteGenerado.isContainsStaticListModelString()){
                            addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSintaxInitializationWithStaticModelString());
                        }
                        else{
                            addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSyntaxInitialization(canonicalDefinition));
                        }
                        if(objComponenteGenerado.isComponentCollection()){
                            addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSyntaxInitializationAsociateScroll(canonicalDefinition));
                        }                        
                    }                    
                }
            }                        
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }        
    }
    
    public void generateSourceCodeSyntaxInitializationPropertiesControls(ArrayList<CodeContextLine> objSourceLinesCode, boolean canonicalDefinition){
        try{
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteGenerado){                    
                    ComponenteGenerado objComponenteGenerado = (ComponenteGenerado) objComponenteDistribuido;
                    if(objComponenteGenerado.isIncluido()){
                        addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSyntaxCollectionProperties(canonicalDefinition));
                        if(objComponenteGenerado.isComponentCollection()){
                            //addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSyntaxDefinitionAsociateScroll(canonicalDefinition));
                        }
                    }                    
                }
            }                        
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }        
    }
    
    public void generateSourceCodeSyntaxInitializationGridBagConstraintsControls(ArrayList<CodeContextLine> objSourceLinesCode, boolean canonicalDefinition){
        try{
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteGenerado){                    
                    ComponenteGenerado objComponenteGenerado = (ComponenteGenerado) objComponenteDistribuido;
                    if(objComponenteGenerado.isIncluido()){
                        //addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSyntaxGridBagConstraints(objComponenteGenerado.getGridBagConstraintsActiva(), canonicalDefinition));
                        addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSyntaxGridBagConstraints(objComponenteGenerado.getObjGridBagConstraintsGUI(), canonicalDefinition));
                    }                    
                }
            }                        
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }        
    }
    
    public void generateSourceCodeSyntaxControlsEventsDefinition(ArrayList<CodeContextLine> objSourceLinesCode, boolean canonicalDefinition){
        try{
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteGenerado){                    
                    ComponenteGenerado objComponenteGenerado = (ComponenteGenerado) objComponenteDistribuido;
                    if(objComponenteGenerado.isIncluido()){
                        addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSyntaxCollectionEvents(canonicalDefinition));
                    }                    
                }
            }                        
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }        
    }    
    
    public void generateSourceCodeSyntaxControlsEventsImplement(ArrayList<CodeContextLine> objSourceLinesCode, boolean canonicalDefinition){
        try{
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteGenerado){                    
                    ComponenteGenerado objComponenteGenerado = (ComponenteGenerado) objComponenteDistribuido;
                    if(objComponenteGenerado.isIncluido()){
                        addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSyntaxCollectionEvents(canonicalDefinition));
                    }                    
                }
            }                        
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }        
    }
    
    public void generateSourceCodeSyntaxCollectionAsociateModelDefinition(ArrayList<CodeContextLine> objSourceLinesCode, boolean canonicalDefinition){                      
        if(objModeloAsociado.geteTipoColeccion() == TipoColeccionModeloAsociado.eAbstractList){                    
            String strTempClassPathTipoDato = ((canonicalDefinition) ? objTipoDato.getObjClass().getCanonicalName() : objTipoDato.getObjClass().getSimpleName());
            if(objTipoDato.contieneRepresentacionesGenericas()){
                strTempClassPathTipoDato += objTipoDato.getClassTypesGeneric(false);
            }
            else{                                
                strTempClassPathTipoDato += "<" + objComponenteGenerador.getObjPropiedadBeans().getStrClassPathParametroDefaul() + ">";
            }
            String strDefinition = "private " + strTempClassPathTipoDato + " objColeccion" + objComponenteGenerador.getName() + ";";
                    //" = new " + strTempClassPathTipoDato + "();\n";                    
            CodeContextLine objSourceLineCode = new CodeContextLine(strDefinition);
            objSourceLinesCode.add(objSourceLineCode);
        }
    }
    
    public void generateSourceCodeSyntaxCollectionAsociateModelInitialization(ArrayList<CodeContextLine> objSourceLinesCode, boolean canonicalDefinition){                      
        if(objModeloAsociado.geteTipoColeccion() == TipoColeccionModeloAsociado.eAbstractList){                    
            String strTempClassPathTipoDato = ((canonicalDefinition) ? objTipoDato.getObjClass().getCanonicalName() : objTipoDato.getObjClass().getSimpleName());
            if(objTipoDato.contieneRepresentacionesGenericas()){
                strTempClassPathTipoDato += objTipoDato.getClassTypesGeneric(false);
            }
            else{                                
                strTempClassPathTipoDato += "<" + objComponenteGenerador.getObjPropiedadBeans().getStrClassPathParametroDefaul() + ">";
            }
            String strDefinition = "objColeccion" + objComponenteGenerador.getName() + " = new " + strTempClassPathTipoDato + "();";                    
            CodeContextLine objSourceLineCode = new CodeContextLine(strDefinition);
            objSourceLinesCode.add(objSourceLineCode);
        }
    }
    
    public void generateSourceCodeSyntaxFunctionEncapsuleAsociateModelDefinition(ArrayList<CodeContextLine> objSourceLinesCode, boolean canonicalDefinition){                      
        if(objModeloAsociado.geteTipoColeccion() == TipoColeccionModeloAsociado.eAbstractList){                    
            String strTempClassPathTipoDato = ((canonicalDefinition) ? objTipoDato.getObjClass().getCanonicalName() : objTipoDato.getObjClass().getSimpleName());
            if(objTipoDato.contieneRepresentacionesGenericas()){
                strTempClassPathTipoDato += objTipoDato.getClassTypesGeneric(false);
            }
            else{                                
                strTempClassPathTipoDato += "<" + objComponenteGenerador.getObjPropiedadBeans().getStrClassPathParametroDefaul() + ">";
            }    
            String strDefinition = "public " + strTempClassPathTipoDato + " devolverColeccion" + objComponenteGenerador.getName() + "(){\n" + 
                    "return objColeccion" + objComponenteGenerador.getName() + ";\n}\n";
            CodeContextLine objSourceLineCode = new CodeContextLine(strDefinition);
            objSourceLinesCode.add(objSourceLineCode);
        }
    }
    
    /**
     * 
     * @param objSourceLinesCode
     * @param canonicalDefinition
     * @return
     */
    public ArrayList<CodeContextLine> generateSourceCodeSyntaxEventsButtonsAbstractListAsociateModelDefinition(ArrayList<CodeContextLine> objSourceLinesCode, boolean canonicalDefinition){
        try{            
            String strEvento = "actionPerformed";            
            Distribuidor objDistribuidor = this.getObjDistribuidorGrupalSeleccionado();
            for(Componente objComponenteDistribuido : objDistribuidor.getObjComponentesDistribuidos()){
                
                PlantillaComponente objPlantillaComponente = objComponenteDistribuido.getObjPlantillaComponenteDistribucionIndividual(objPlantillaComboDistribucionIndividualSeleccionada);
                
                int idComponente = this.id;
                int idPlantilla = objPlantillaComponente.getIdPlantilla();
                int idPlantillaComponente = objPlantillaComponente.getId();
                
                for(InternalProperty objInternalProperty : GeneradorComponentes.crearInternalProperties(idComponente, idPlantilla, idPlantillaComponente)){
                    if(objInternalProperty.getName().equals(CodeConstants.ADDITEMLIST) ||
                            objInternalProperty.getName().equals(CodeConstants.DELETEITEMLIST)){
                        CodeContextLine objCodeContextLine = objComponenteDistribuido.generateSourceCodeSyntaxEvent(strEvento, canonicalDefinition);
                        objSourceLinesCode.add(objCodeContextLine);
                    }                    
                }                
            }       
            return objSourceLinesCode;            
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
    
    /**
     * 
     * @param objSourceLinesCode
     * @param canonicalDefinition
     * @return
     */
    public ArrayList<CodeContextLine> generateSourceCodeSyntaxEventsButtonsAbstractListAsociateModelCode(ArrayList<CodeContextLine> objSourceLinesCode, boolean canonicalDefinition){
        try{
            String strEvento = "actionPerformed";              
            Distribuidor objDistribuidor = this.getObjDistribuidorGrupalSeleccionado();
            for(Componente objComponenteDistribuido : objDistribuidor.getObjComponentesDistribuidos()){
                
                PlantillaComponente objPlantillaComponente = objComponenteDistribuido.getObjPlantillaComponenteDistribucionIndividual(objPlantillaComboDistribucionIndividualSeleccionada);
                
                int idComponente = this.id;
                int idPlantilla = objPlantillaComponente.getIdPlantilla();
                int idPlantillaComponente = objPlantillaComponente.getId();
                
                for(InternalProperty objInternalProperty : GeneradorComponentes.crearInternalProperties(idComponente, idPlantilla, idPlantillaComponente)){                    
                    if(objInternalProperty.getName().equals(CodeConstants.ADDITEMLIST)){
                        CodeContextLine objCodeContextLine = objComponenteDistribuido.generateSourceCodeSyntaxEvent(strEvento, canonicalDefinition);
                        objSourceLinesCode.add(objCodeContextLine);                        
                        generateSourceCodeButtonAddAbstractListAsociateModel(objCodeContextLine.getObjInternCode(), canonicalDefinition);
                    }
                    else if(objInternalProperty.getName().equals(CodeConstants.DELETEITEMLIST)){
                        CodeContextLine objCodeContextLine = objComponenteDistribuido.generateSourceCodeSyntaxEvent(strEvento, canonicalDefinition);
                        objSourceLinesCode.add(objCodeContextLine);
                        generateSourceCodeButtonDelAbstractListAsociateModel(objCodeContextLine.getObjInternCode(), canonicalDefinition);
                    }                    
                }                
            }
                    
            return objSourceLinesCode;            
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }   
    
    /**
     * 
     * @param objSourceLinesCode
     * @param canonicalDefinition
     * @return
     */
    public ArrayList<CodeContextLine> generateSourceCodeButtonAddAbstractListAsociateModel(ArrayList<CodeContextLine> objSourceLinesCode, boolean canonicalDefinition){
        String strLine;
        CodeContextLine objCodeContextLine;
        
        ComponenteDistribuidorModeloAsociado objComponenteDistribuidorModeloAsociado =
                objModeloAsociado.getObjComponenteDistribuidorModeloAsociado();
                

        strLine = objComponenteDistribuidorModeloAsociado.getName() + " objDialog = new " + objModeloAsociado.getObjComponenteDistribuidorModeloAsociado().getName() + "();";
        objCodeContextLine = new CodeContextLine(strLine);
        objSourceLinesCode.add(objCodeContextLine);

        strLine = "objDialog.setModal(true);";
        objCodeContextLine = new CodeContextLine(strLine);
        objSourceLinesCode.add(objCodeContextLine);

        strLine = "objDialog.setVisible(true);";
        objCodeContextLine = new CodeContextLine(strLine);
        objSourceLinesCode.add(objCodeContextLine);

        strLine = "Object obj = objDialog.getObj();";
        objCodeContextLine = new CodeContextLine(strLine);
        objSourceLinesCode.add(objCodeContextLine);

        strLine = "if(obj != null){";
        objCodeContextLine = new CodeContextLine(strLine);
        objSourceLinesCode.add(objCodeContextLine);
        
        String strNameCollection = objComponenteGenerador.getName();

        if(objTipoDato.contieneRepresentacionesGenericas()){
            String strGeneric = objTipoDato.getObjTiposGenericos().get(0).getStrClassPath();
            strLine = "\tobjColeccion" + strNameCollection + ".add((" + strGeneric + ")obj);";
        }
        else{
            strLine = "\tobjColeccion" + strNameCollection + ".add(obj);";
        }               
        objCodeContextLine = new CodeContextLine(strLine);
        objSourceLinesCode.add(objCodeContextLine);

        strLine = "\tjavax.swing.JList objList = new javax.swing.JList(objColeccion" + strNameCollection + ".toArray());";
        objCodeContextLine = new CodeContextLine(strLine);
        objSourceLinesCode.add(objCodeContextLine);

        strLine = "\t" + objComponenteGenerador.getName() + ".setModel(objList.getModel());";
        objCodeContextLine = new CodeContextLine(strLine);
        objSourceLinesCode.add(objCodeContextLine);

        strLine = "}\n";
        objCodeContextLine = new CodeContextLine(strLine);
        objSourceLinesCode.add(objCodeContextLine);
        return objSourceLinesCode;            
    }
    
    /**
     * 
     * @param objSourceLinesCode
     * @param canonicalDefinition
     * @return
     */
    public ArrayList<CodeContextLine> generateSourceCodeButtonDelAbstractListAsociateModel(ArrayList<CodeContextLine> objSourceLinesCode, boolean canonicalDefinition){
        String strLine;
        CodeContextLine objCodeContextLine;
        String strNameCollection = objComponenteGenerador.getName();
        
        strLine = "if(" + strNameCollection + ".isSelectionEmpty())return;";
        objCodeContextLine = new CodeContextLine(strLine);
        objSourceLinesCode.add(objCodeContextLine);
        
        strLine = "if(javax.swing.JOptionPane.showConfirmDialog(this,\"¿Desea Eliminar el Elemento de la Lista?\", \"Eliminar Elemento\", javax.swing.JOptionPane.YES_NO_OPTION, javax.swing.JOptionPane.QUESTION_MESSAGE) == javax.swing.JOptionPane.NO_OPTION)return;";     
        objCodeContextLine = new CodeContextLine(strLine);
        objSourceLinesCode.add(objCodeContextLine);
        
        strLine = "objColeccion" + strNameCollection + ".remove(" + strNameCollection + ".getSelectedIndex());";
        objCodeContextLine = new CodeContextLine(strLine);
        objSourceLinesCode.add(objCodeContextLine);
        
        strLine = "javax.swing.JList objList = new javax.swing.JList(objColeccion" + strNameCollection + ".toArray());";
        objCodeContextLine = new CodeContextLine(strLine);
        objSourceLinesCode.add(objCodeContextLine);
        
        strLine = strNameCollection + ".setModel(objList.getModel());";                        
        objCodeContextLine = new CodeContextLine(strLine);
        objSourceLinesCode.add(objCodeContextLine);       
        
        return objSourceLinesCode;            
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldDefinitionInstance(ArrayList<CodeContextLine> objSourceLinesCode) {
        try{            
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteGenerado){                    
                    ComponenteGenerado objComponenteGenerado = (ComponenteGenerado) objComponenteDistribuido;
                    if(objComponenteGenerado.isIncluido()){
                        addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSyntaxDefinition(true));
                        if(objComponenteGenerado.isComponentCollection()){
                            addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSyntaxDefinitionAsociateScroll(true));
                        }
                        if(objComponenteGenerado.isContainsStaticListModelString()){
                            addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSintaxDefinitionStaticListModel());
                        }                        
                    }                    
                }
                else if(objComponenteDistribuido instanceof ComponenteDistribuidor){
                    ComponenteDistribuidor objComponenteDistribuidor = (ComponenteDistribuidor) objComponenteDistribuido;
                    objComponenteDistribuidor.generateSourceCodeSyntaxFaseFieldDefinitionInstance(objSourceLinesCode);
                }
            }
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }        
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldDefinitionClass(ArrayList<CodeContextLine> objSourceLinesCode) {
        try{
            if(objModeloAsociado != null){
                generateSourceCodeSyntaxCollectionAsociateModelDefinition(objSourceLinesCode, true); 
            }            
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }        
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldDefinitionConstant(ArrayList<CodeContextLine> objSourceLinesCode) {        
        UtilRender.printlnConsole("Fase No Requerida en la Generación de Código del Contexto Actual.", UtilRender.ACTION_NORMAL, false);            
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldInitializationInstance(ArrayList<CodeContextLine> objSourceLinesCode) {
        try{
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteGenerado){                    
                    ComponenteGenerado objComponenteGenerado = (ComponenteGenerado) objComponenteDistribuido;
                    if(objComponenteGenerado.isIncluido()){
                        if(objComponenteGenerado.isContainsStaticListModelString()){
                            addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSintaxInitializationWithStaticModelString());
                        }
                        else{
                            addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSyntaxInitialization(true));
                        }
                        if(objComponenteGenerado.isComponentCollection()){
                            addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSyntaxInitializationAsociateScroll(true));
                        }                        
                    }                    
                }
                else if(objComponenteDistribuido instanceof ComponenteDistribuidor){
                    ComponenteDistribuidor objComponenteDistribuidor = (ComponenteDistribuidor) objComponenteDistribuido;
                    objComponenteDistribuidor.generateSourceCodeSyntaxFaseFieldInitializationInstance(objSourceLinesCode);
                }
            }                        
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }        
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldInitializationClass(ArrayList<CodeContextLine> objSourceLinesCode) {
        try{
            if(objModeloAsociado != null){
                generateSourceCodeSyntaxCollectionAsociateModelInitialization(objSourceLinesCode, true); 
            }            
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }   
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldInitializationProperties(ArrayList<CodeContextLine> objSourceLinesCode) {
        try{
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteGenerado){                    
                    ComponenteGenerado objComponenteGenerado = (ComponenteGenerado) objComponenteDistribuido;
                    if(objComponenteGenerado.isIncluido()){
                        addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSyntaxCollectionProperties(true));
                        if(objComponenteGenerado.isComponentCollection()){
                            //addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSyntaxDefinitionAsociateScroll(canonicalDefinition));
                        }
                    }                    
                }
            }                        
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldInitializationGridBagConstraints(ArrayList<CodeContextLine> objSourceLinesCode) {
        try{
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteGenerado){                    
                    ComponenteGenerado objComponenteGenerado = (ComponenteGenerado) objComponenteDistribuido;
                    if(objComponenteGenerado.isIncluido()){
                        //addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSyntaxGridBagConstraints(objComponenteGenerado.getGridBagConstraintsActiva(), canonicalDefinition));
                        addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSyntaxGridBagConstraints(objComponenteGenerado.getObjGridBagConstraintsGUI(), true));
                    }                    
                }
            }                        
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void generateSourceCodeSyntaxFaseMethodDefinitionEvent(ArrayList<CodeContextLine> objSourceLinesCode) {
        try{
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteGenerado){                    
                    ComponenteGenerado objComponenteGenerado = (ComponenteGenerado) objComponenteDistribuido;
                    if(objComponenteGenerado.isIncluido()){
                        addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSyntaxCollectionEvents(true));
                    }                    
                }
            } 
            if(objModeloAsociado != null){                
                generateSourceCodeSyntaxEventsButtonsAbstractListAsociateModelDefinition(objSourceLinesCode, true);
            }
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void generateSourceCodeSyntaxFaseMethodImplementEvent(ArrayList<CodeContextLine> objSourceLinesCode) {
        try{
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteGenerado){                    
                    ComponenteGenerado objComponenteGenerado = (ComponenteGenerado) objComponenteDistribuido;
                    if(objComponenteGenerado.isIncluido()){
                        addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSyntaxCollectionEvents(true));
                    }                    
                }
            }
            if(objModeloAsociado != null){             
                generateSourceCodeSyntaxControlsEventsImplement(objSourceLinesCode, true);
                generateSourceCodeSyntaxEventsButtonsAbstractListAsociateModelCode(objSourceLinesCode, true);
            }
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void generateSourceCodeSyntaxFaseMethodImplementFunctionSet(ArrayList<CodeContextLine> objSourceLinesCode) {
        try{
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteGenerado){                    
                    ComponenteGenerado objComponenteGenerado = (ComponenteGenerado) objComponenteDistribuido;
                    if(objComponenteGenerado.isIncluido()){
                        addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSyntaxFunctionGetSet(true));
                    }                    
                }
            }
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void generateSourceCodeSyntaxFaseMethodImplementFunctionGet(ArrayList<CodeContextLine> objSourceLinesCode) {
        try{
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteGenerado){                    
                    ComponenteGenerado objComponenteGenerado = (ComponenteGenerado) objComponenteDistribuido;
                    if(objComponenteGenerado.isIncluido()){
                        addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSyntaxFunctionGetSet(true));
                    }                    
                }
            }
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}